package com.example.demo.service;

import com.example.demo.dto.TaskApprovalStatusDTO;
import com.example.demo.dto.TaskApprovalWithRawDataDTO;
import com.example.demo.dto.TaskApprovalNodeDetailDTO;
import com.example.demo.dto.UserTaskStatisticsDTO;
import com.example.demo.dto.DataSourceUserStatisticsDTO;
import com.example.demo.dto.DataSourceTaskStatisticsDTO;
import com.example.demo.request.ApproveTaskRequest;
import com.example.demo.request.CreateTaskApprovalStatusRequest;
import com.example.demo.request.ForwardTaskRequest;

import java.util.List;

public interface TaskApprovalStatusService {

    /**
     * 分页查询审批状态列表
     */
    List<TaskApprovalStatusDTO> getTaskApprovalStatuses(int page, int size, Long taskId, Long flowId);

    /**
     * 统计审批状态总数
     */
    long countTaskApprovalStatuses(Long taskId, Long flowId);

    /**
     * 根据ID查询审批状态详情
     */
    TaskApprovalStatusDTO getTaskApprovalStatusById(Long id);

    /**
     * 创建审批状态
     */
    TaskApprovalStatusDTO createTaskApprovalStatus(CreateTaskApprovalStatusRequest request);

    /**
     * 更新审批状态
     */
    TaskApprovalStatusDTO updateTaskApprovalStatus(Long id, CreateTaskApprovalStatusRequest request);

    /**
     * 删除审批状态
     */
    void deleteTaskApprovalStatus(Long id);

    /**
     * 根据数据源ID初始化任务审批状态
     * 获取该数据源下未分发的任务，分发到流程，并为每个流程节点创建审批状态记录
     */
    int initializeTaskApprovalStatusByDataSource(Long dataSourceId);

    /**
     * 根据任务ID获取审批状态列表
     */
    List<TaskApprovalStatusDTO> getTaskApprovalStatusesByTaskId(Long taskId);

    /**
     * 根据流程ID获取审批状态列表
     */
    List<TaskApprovalStatusDTO> getTaskApprovalStatusesByFlowId(Long flowId);

    /**
     * 根据审批人ID和状态为处理中(1)获取审批状态列表
     */
    List<TaskApprovalStatusDTO> getTaskApprovalStatusesByApproverIdAndStatusProcessing(Long approverId);

    /**
     * 根据审批人ID和状态为已审批(2)获取审批状态列表
     */
    List<TaskApprovalStatusDTO> getTaskApprovalStatusesByApproverIdAndStatusApproved(Long approverId);

    /**
     * 根据审批人ID和状态为处理中(1)获取包含原始数据的审批状态列表
     */
    List<TaskApprovalWithRawDataDTO> getTaskApprovalStatusesByApproverIdAndStatusProcessingWithRawData(Long approverId);

    /**
     * 根据任务ID获取审批节点详情
     */
    List<TaskApprovalNodeDetailDTO> getTaskApprovalNodeDetailsByTaskId(Long taskId);

    /**
     * 根据任务ID获取当前正在执行审批的节点信息
     * 返回状态为处理中(1)的审批节点
     */
    TaskApprovalWithRawDataDTO getCurrentProcessingNodeByTaskId(Long taskId);

    /**
     * 审批任务
     * 将审批状态设置为已通过(2)，并更新审批意见
     * 同时将下一个节点的状态从待处理(0)更新为处理中(1)
     */
    TaskApprovalStatusDTO approveTask(ApproveTaskRequest request);

    /**
     * 转发任务
     * 将当前记录状态更新为5（已转发），并创建一条新记录给新审批人，状态设为1（处理中）
     */
    TaskApprovalStatusDTO forwardTask(ForwardTaskRequest request);
    

        /**
     * 根据用户ID获取用户任务统计信息
     * 包括总任务数、已完成任务数、剩余任务数以及任务列表
     */
    UserTaskStatisticsDTO getUserTaskStatistics(Long userId);
    
    /**
     * 根据数据源ID获取该数据源下所有用户的审批统计信息
     * 包括每个用户的任务统计以及整体统计信息
     */
    DataSourceUserStatisticsDTO getDataSourceUserStatistics(Long dataSourceId);
    
    /**
     * 根据数据源ID获取该数据源的任务统计信息
     * 包括总任务数、已完成、待处理、处理中、已拒绝、已跳过等状态的任务数
     */
    DataSourceTaskStatisticsDTO getDataSourceTaskStatistics(Long dataSourceId);
}